home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / hard / hack / i2clib40.lha / i2clib40 / src / VPS.c < prev   
C/C++ Source or Header  |  1999-01-10  |  7KB  |  263 lines

  1. /*========================================================================*
  2.  |  Datei: VPS.c                                      Datum: 17 Aug 1997  |
  3.  *------------------------------------------------------------------------*
  4.  |  Überwacht das ausgestrahlte VPS-Signal mittels SAA 4700 am I²C-Bus.   |
  5.  |  VPS-Zeit wird auch gleich mittels SAA 1064 auf LEDs angezeigt.        |
  6.  |                                                                        |
  7.  *========================================================================*/
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <string.h>
  12. #include <limits.h>
  13. #include <proto/exec.h>
  14. #include <proto/dos.h>
  15. #include <proto/i2c.h>
  16. #include <libraries/i2c.h>
  17. #include "LED.h"
  18.  
  19. struct Library *I2C_Base;
  20.  
  21.  
  22. #define SAA4700 0x20
  23.  
  24. struct VpsInfo
  25.     {
  26.     BYTE bBereich;                /* 0..3 */
  27.     BYTE bLand;                   /* 0..15 */
  28.     BYTE bSender;                 /* 0..63 */
  29.     STRPTR strName;
  30.     };
  31.  
  32.  
  33. /* globale Tabellen: */
  34.  
  35. STRPTR straAudio[4] =
  36.     {
  37.     "?", "M", "S", "2"
  38.     };
  39.  
  40. STRPTR straFsk[4] =
  41.     {
  42.     "X0", "JF", "X2", "X3"
  43.     };
  44.  
  45. #define ANZSENDER 33
  46.  
  47. struct VpsInfo viaSender[ ANZSENDER ] =
  48.     {
  49.     { 3, 13,  1, "ARD" },
  50.     { 3, 13,  2, "ZDF" },
  51.     { 3, 13,  3, "ARD+ZDF" },
  52.     { 3, 13,  4, "ARD/N" },
  53.     { 3, 13,  7, "3sat" },
  54.     { 3, 13,  8, "Phoenix" },
  55.     { 3, 13,  9, "Kinderkanal" },
  56.     { 3, 13, 11, "Bayern 3" },
  57.     { 3, 13, 15, "Hessen" },
  58.     { 3, 13, 20, "Nord 3" },
  59.     { 3, 13, 33, "Südwest BW" },
  60.     { 3, 13, 36, "Südwest RP" },
  61.     { 3, 13, 37, "ARD/W" },
  62.     { 3, 13, 38, "WDR" },
  63.     { 3, 13, 62, "MDR" },
  64.     { 2, 13,  2, "ORB" },
  65.     { 2, 13,  5, "arte" },
  66.     { 2, 13, 10, "Super RTL" },
  67.     { 2, 13, 12, "n-tv" },
  68.     { 2, 13, 13, "DSF" },
  69.     { 2, 13, 14, "Vox" },
  70.     { 2, 13, 15, "RTL 2" },
  71.     { 2, 13, 17, "Eurosport" },
  72.     { 2, 13, 18, "Kabel 1" },
  73.     { 2, 13, 20, "Pro 7" },
  74.     { 2, 13, 43, "RTL" },
  75.     { 2, 13, 44, "Premiere" },
  76.     { 2, 13, 57, "Sat 1" },
  77.     { 2, 13, 58, "tm 3" },
  78.     { 2,  4,  2, "Teleclub" },
  79.     { 1, 13,  4, "BR alpha" },
  80.     { 1, 13, 63, "H·O·T" },
  81.     { 1, 14, 62, "Nickelodeon" },
  82.     };
  83.  
  84.  
  85. void LedShow( ULONG ulCode )
  86. /* VPS-Zeit bzw. Sondercodes am LED-Display anzeigen */
  87.     {
  88.     WORD wTag, wMonat, wStunde, wMinute;
  89.     BYTE baBuf[5];
  90.  
  91.     if( ulCode == ULONG_MAX )
  92.         SendLed( "----" );
  93.     else
  94.         {
  95.         wTag    = (ulCode >> 25) % 32;
  96.         wMonat  = (ulCode >> 21) % 16;
  97.         wStunde = (ulCode >> 16) % 32;
  98.         wMinute = (ulCode >> 10) % 64;
  99.         switch( wStunde )
  100.             {
  101.             case 31:
  102.                 SendLed( "S---" );  /* Statuscode */
  103.                 break;
  104.             case 30:
  105.                 SendLed( "L---" );  /* Leercode */
  106.                 break;
  107.             case 29:
  108.                 SendLed( "P---" );  /* Pause */
  109.                 break;
  110.             default:
  111.                 sprintf( baBuf, "%2d%02d", wStunde, wMinute );
  112.                 SendLed( baBuf );
  113.             }
  114.         }
  115.     }
  116.  
  117.  
  118. void FileShow( ULONG ulCode0, ULONG ulCode1, FILE* Datei )
  119.     {
  120.     WORD wTag, wMonat, wStunde, wMinute;
  121.     WORD wBereich, wLand, wSender, wAudio, wFsk;
  122.     WORD wLauf;
  123.     struct DateStamp dsJetzt;
  124.  
  125.     if( !Datei )
  126.         return;
  127.     DateStamp( &dsJetzt );
  128.     fprintf( Datei, "%2ld:%02ld:%02ld - ", dsJetzt.ds_Minute / 60,
  129.           dsJetzt.ds_Minute % 60, dsJetzt.ds_Tick / TICKS_PER_SECOND );
  130.     if( ulCode0 == ULONG_MAX )
  131.         fprintf( Datei, "kein VPS-Signal\n" );
  132.     else
  133.         {
  134.         wBereich =  ulCode0 >> 30;
  135.         wTag     = (ulCode0 >> 25) % 32;
  136.         wMonat   = (ulCode0 >> 21) % 16;
  137.         wStunde  = (ulCode0 >> 16) % 32;
  138.         wMinute  = (ulCode0 >> 10) % 64;
  139.         wLand    = (ulCode0 >>  6) % 16;
  140.         wSender  =  ulCode0        % 64;
  141.         wAudio   =  ulCode1 >> 30;
  142.         wFsk     = (ulCode1 >> 28) %  4;
  143.         switch( wStunde )
  144.             {
  145.             case 31:
  146.                 fprintf( Datei, "%-20s", "Statuscode" );
  147.                 break;
  148.             case 30:
  149.                 fprintf( Datei, "%-20s", "Leercode" );
  150.                 break;
  151.             case 29:
  152.                 fprintf( Datei, "%-20s", "Pause" );
  153.                 break;
  154.             default:
  155.                 fprintf( Datei, "VPS %2d:%02d am %02d.%02d. ",
  156.                     wStunde, wMinute, wTag, wMonat );
  157.             }
  158.         fprintf( Datei, "%s, %s, ", straFsk[wFsk], straAudio[wAudio] );
  159.         fprintf( Datei, "A%d/L%02d/P%02d", wBereich, wLand, wSender );
  160.         for( wLauf = 0; wLauf < ANZSENDER; wLauf++ )
  161.             if( viaSender[wLauf].bBereich == wBereich
  162.              && viaSender[wLauf].bLand    == wLand
  163.              && viaSender[wLauf].bSender  == wSender )
  164.                 break;
  165.         if( wLauf < ANZSENDER )
  166.             fprintf( Datei, ": %s", viaSender[wLauf].strName );
  167.         fprintf( Datei, "\n" );
  168.         }
  169.     }
  170.  
  171.  
  172. void LibClose( struct Library **ppLib )
  173.     {
  174.     if( *ppLib )
  175.         {
  176.         CloseLibrary( *ppLib );
  177.         *ppLib = NULL;
  178.         }
  179.     }
  180.  
  181.  
  182. struct Library* LibOpen( STRPTR strName, LONG lVersion )
  183.     {
  184.     struct Library* pLib;
  185.  
  186.     pLib = OpenLibrary( strName, lVersion );
  187.     if( !pLib )
  188.         {
  189.         printf( "Can't open %s", strName );
  190.         printf( lVersion ? " V%ld+\n" : "\n", lVersion );
  191.         exit( 10 );
  192.         }
  193.     else
  194.         return pLib;
  195.     }
  196.  
  197.  
  198. void CleanUp()
  199.     {
  200.     SendLed( "    " );
  201.     LibClose( &I2C_Base );
  202.     LibClose( (struct Library **)&DOSBase );
  203.     }
  204.  
  205.  
  206. int main(int argc, char *argv[])
  207.     {
  208.     FILE *Datei;
  209.     STRPTR strName;
  210.     WORD wRetry;
  211.     ULONG laVpsData[2];
  212.     ULONG lLastData, lLastValid;
  213.     ULONG lError, lLastError;
  214.  
  215.     DOSBase  = NULL;
  216.     I2C_Base = NULL;
  217.     atexit( CleanUp );            /* Librarys bei Ctrl-C mitschließen */
  218.     I2C_Base = LibOpen( "i2c.library", 39 );
  219.     DOSBase  = (struct DosLibrary *)LibOpen( "dos.library", 0 );
  220.     printf( "VPS-Signalüberwachung. Abbruch mit Ctrl-C\n" );
  221.     if( argc<2 )
  222.         strName = "RAM:VPSdatei";
  223.     else
  224.         strName = argv[1];
  225.     printf( "Ausgabedatei: \"%s\"\n", strName );
  226.     lLastData = 0;
  227.     lLastValid = 0;
  228.     lLastError = 0;
  229.     while( TRUE )                 /* Tja, Ctrl-C benutzen :^) */
  230.         {
  231.         wRetry = 25;  /* erst nach 2 * 1/2 Sekunde 'kein VPS-Signal' aufgeben */
  232.         do
  233.             {
  234.             lError = ReceiveI2C( SAA4700, 5, (char *)laVpsData );
  235.             if( (lError & 0xFF) == 0 )
  236.                 laVpsData[0] = ULONG_MAX;  /* entspricht "kein VPS-Empfang" */
  237.             Delay(1);             /* 1/50 sec warten */
  238.             }
  239.         while( laVpsData[0] == ULONG_MAX && wRetry-- );
  240.         if( lError != lLastError)
  241.             printf( "I²C-Bus: %s\n", I2CErrText( lError) );
  242.         lLastError = lError;
  243.         if( laVpsData[0] == lLastData && laVpsData[0] != lLastValid )
  244.             {
  245.             lLastValid = laVpsData[0];
  246.             FileShow( laVpsData[0], laVpsData[1], stdout );
  247.             Datei = fopen( strName, "a" );
  248.             FileShow( laVpsData[0], laVpsData[1], Datei );
  249.             fclose( Datei );
  250.             SendLed( "    ");     /* Display kurz blinken lassen */
  251.             Delay( 10 );
  252.             LedShow( laVpsData[0] );
  253.             }
  254.         Delay( 5 );               /* 10 Meßwerte pro Sekunde reichen */
  255.         lLastData = laVpsData[0];
  256.         printf( "\r" );
  257.         fflush( stdout );         /* Ctrl-C-Abfrage erzwingen */
  258.         }
  259.  
  260.     return 0;
  261.     }
  262.  
  263.